/* 
 * 青莲云和TCU的接口 
 * 
 * 
 */

#ifndef    _INTERFACE_QL_H
#define    _INTERFACE_QL_H


#include  "share_type.h"
#include  "program.h"
#include "meter_ql.h"
#include "meter_com.h"

#ifdef __cplusplus
extern "C"{
#endif  

#define LIB_QL_PATH "/usr/lib/libQLClient.so"

#define CHARGE_STOP_FULL                0x1000      //已经充满
#define CHARGE_STOP_APP                 0x1001      //APP 远程停止
#define CHARGE_STOP_BALANCE             0x1002      //余额不足
#define CHARGE_STOP_SCREEN              0x1003      //结束充电，触控屏手动停止
#define CHARGE_STOP_PLATFROM            0x1004      //后台停止充电
#define CHARGE_STOP_TIME                0x1005      //充电时间满足设定条件
#define CHARGE_STOP_ELEC                0x1006      //充电电量满足设定条件
#define CHARGE_STOP_MONEY               0x1007      //充电金额满足设定条件
#define CHARGE_STOP_CARD                0x1008      //结束充电，手动刷卡停止充电
#define CHARGE_STOP_NO_EFFEC_CURR       0x1009      //无有效电流停止
#define CHARGE_STOP_BMS_ERR             0x100A      //BMS异常终止充电
#define CHARGE_STOP_BMS_CONDITION       0x100B      //BMS达到终止条件停止
#define CHARGE_STOP_PILE_CONDITION      0x100C      //充电桩达到终止条件停止
#define CHARGE_STOP_GUN_CONN_ERR        0x100D      //枪未正确连接
#define CHARGE_STOP_PULL_GUN            0x100E      //结束充电，充电过程中拔枪
#define CHARGE_STOP_APP_ACCOUNT         0x100F      //结束充电，APP账号停止充电
#define CHARGE_STATE_ERR                0xFFFF      //充电枪正在充电时收到开始充电指令，或未在充电时收到停止充电指令

// 时段信息 
#define PERIOD_LEN                      48 
// 时段类型 
#define PRICE_TPYE_LEN                  4

// 指令类型 
typedef enum
{
    RENEW_NET_FLAG  =0,
    SAVE_CHARGE_RECORD,     
    READ_CHARGE_RECORD,     
    FIN_CHARGE_RECORD,      
    SET_1ST_QRCODE,
    SET_2ND_QRCODE,
    UPDATA_FILES,
    SAVE_FEE_CFG,
	SET_STOP_DETAIL_REASON,  // 2021-07-04
	SET_BILL,
	GET_CAM_METER_ST,
}CMDNUM;

// 回调接口  
typedef int (*callbackFun)(u8, void *);

// 命令处理函数指针 
typedef int	(*AdjPw)(u8 gunid,u8 type,int value); 	

// 解闭锁 
typedef int (*unlock)(u8 gunid, u8 type);


// 命令队列 
typedef struct
{
	short  cmdtype;
	void   *body;
} cmdlist; 

// 启动，停止充电 失败原因信息/ 启动停止充电 原因 2021-07-04 
typedef struct 
{
	u8  gun_id;	// 0~7, 枪序号
	u8  reason;	// 启动失败故障原因类型、停止原因类型、故障原因类型
	u16 detail_code;	// 具体故障码，故障原因类型使用，
}t_operate_reason;

// 计费信息 
typedef struct{
	u16  charge_fee[48];
	u16  service_fee[48];
	u16  belate_fee[48];
} ql_fee_config;

typedef struct
{
    uint16_t    price_elec[PRICE_TPYE_LEN];                 //依次保存四种计费时段，尖、高、平、谷的对应价格，单位:分
    uint16_t    price_service[PRICE_TPYE_LEN];              //依次保存四种计费时段，尖、高、平、谷的对应价格，单位:分
    uint8_t     period[PERIOD_LEN];                         //每半小时一个时段，一天共48个时段，每个时段对应四种价格的某一种
} price_t;


// 命令处理函数指针 
typedef int	(*cmd_process)(cmdlist *);	

typedef struct
{
	char type;              // 1: 直流,     2:交流
	unsigned char gunnum;   // 充电枪数量 
	char  devNo[32];        // 设备序号 
	u16   rated_v;          // 额定电压 
	u16   rated_i;          // 额定电流
	u16   max_v;            // 最大电压
	u16   max_i;            // 最大电流
	u16   max_power;        // 最大功率
	u16   min_power;        // 最小功率
	u16   rated_power;      // 额定功率 
	
	char  server_ip[32];      // 服务器IP
	u32   server_port;        // 端口 
	
    char  interface_id[12];     // 接口ID
    char  token[20];            // 接口token
    
	u16	  charge_mode_num;      // 模块个数
    u16   charge_mode_rate;     // 总功率
    callbackFun startCharge;    // 开始充电接口 
    callbackFun stopCharge;     // 停止充电接口 
    callbackFun_log writelog;   // 写日志接口 
 	AdjPw  adjust_charge_pw;    // 调整充电功率  
 	unlock unlock_func;         // 解锁操作
	cmd_process     cmd_fun;    // 命令处理函数指针
	ql_fee_config  fee_config;  // 费率配置信息 
}ql_para_form_main; //从主控传来的参数  _tmp_print_str





// 申请充电参数
typedef struct
{
	u8	    guntab;
	u8	    billmode;//充电策略0:充满为止（默认）	1:时间控制充电	2:金额控制充电	3:电量控制充电	4:按 SOC 控制充电
	u32		value;//充电策略参数时间单位为 1 秒	金额单位为 0.01 元	电量时单位为 0.01kw	SOC 单位为%
	u8	    serialnum[32];//订单号--用户识别号(App)
	u8	    allow_offline_charge;//断网充电标志
	int		allow_offline_charge_kw_amout;//离线可充电电量
	u32     account_balance;
	u8      startmode; //1 远程充电 0 卡充电
	ql_fee_config  fee_config;
} Charge_Arg;//xj_cmd_7;

// 主站成功
typedef struct
{
	Charge_Arg * p_chargepara;
    start_mx *   p_startInfo;
}StartInfo;//从主控接收的充电成功信息

typedef struct
{
	Charge_Arg * p_chargepara;      // 充电配置信息 
    start_mx *   p_startInfo;       // BMS信息
}ChargeStartInfo; // 从主控接收的充电成功信息

extern Charge_Arg           g_charge_arg[];     // 充电时费率信息 
extern ql_para_form_main    para_ql;            // 青莲云配置参数 

// 青莲云任务初始化, 启动任务   
typedef int (*init_ql_fun)(void*);

// 初始化青莲云的运行参数  
void QLcloudInit(pconf conf);

// 更新BMS配置信息 
int update_Bms(u8 gunid,void* pdata);

// 初始化二维码 
int initQRCode(u8 gunid );

// 保存二维码 
void SaveQRCode(u8 gunid,char*rdcode );


#ifdef __cplusplus
}
#endif

#endif

